package edu.tfh.s2.ehkbot.steuerung.fehlersteuerung;

import java.lang.Thread.State;
import java.util.HashMap;

import edu.tfh.s2.ehkbot.daten.Protokoll;

/**
 * Die FehlerErkennerVerwaltung speichert Profiele.
 * 
 * @author s2zehn
 */
public class FehlerErkennerVerwaltung {
	public class NoProfileFound extends Exception {
		private static final long serialVersionUID = 1L;
	}

	private FehlerErkennerProfiel lastActive = null;
	private HashMap<String, FehlerErkennerProfiel> profile = new HashMap<String, FehlerErkennerProfiel>();

	/**
	 * Fügt ein neues Profiel beim Verwalter ein.
	 * 
	 * @param tatigkeit
	 *            Die Tätigkeit, Profiel Name.
	 * @param einProfiel
	 *            Das Fehlererkennungs Profiel.
	 */
	public void addProfiel(String tatigkeit, FehlerErkennerProfiel einProfiel) {
		if (profile.containsKey(tatigkeit)) {
			if (!profile.get(tatigkeit).equals(einProfiel)) {
				stopProfile(profile.get(tatigkeit));
				profile.put(tatigkeit, einProfiel);
				try {
					startProfile(tatigkeit);
				} catch (NoProfileFound e) {
					Protokoll.getInstanc().exception(e);
				}
			}
		} else
			profile.put(tatigkeit, einProfiel);
	}

	/**
	 * Startet ein Profiel.
	 * 
	 * @param taetigkeit
	 *            Das Profiel mi
	 * @throws NoProfileFound
	 */
	private void startProfile(String taetigkeit) throws NoProfileFound {
		if (!profile.containsKey(taetigkeit))
			throw new NoProfileFound();
		stopProfile(lastActive);

		lastActive = profile.get(taetigkeit);
		lastActive.start();
	}

	/**
	 * Stop die Fehlererkennung.
	 */
	public void stopFehlerErkennung() {
		stopProfile(lastActive);
	}

	/**
	 * Hilfsfunktion die ein Profiel Stopt.
	 * 
	 * @param fehlerErkennerProfiel
	 */
	private void stopProfile(FehlerErkennerProfiel fehlerErkennerProfiel) {
		if (fehlerErkennerProfiel != null) {
			if (fehlerErkennerProfiel.getState() == State.RUNNABLE) {
				fehlerErkennerProfiel.beende();
				try {
					fehlerErkennerProfiel.join();
				} catch (InterruptedException e) {
					Protokoll.getInstanc().exception(e);
				}
			}
		}
	}

}
